mir: track focused window
authorWilliam Hua <william.hua@canonical.com>
Fri, 14 Oct 2016 21:00:34 +0000 (17:00 -0400)
committerWilliam Hua <william.hua@canonical.com>
Thu, 5 Jan 2017 22:57:36 +0000 (17:57 -0500)
https://bugzilla.gnome.org/show_bug.cgi?id=775732

gdk/mir/gdkmir-private.h
gdk/mir/gdkmirdisplay.c
gdk/mir/gdkmireventsource.c

index 69f927fab91c2b6d0afd1a1a3c34e9a8084d3345..0ccf28e0b38da2c6a61fcab8377fcea3e76621b4 100644 (file)
@@ -107,6 +107,10 @@ void _gdk_mir_event_source_queue (GdkMirWindowReference *window_ref, const MirEv
 
 MirPixelFormat _gdk_mir_display_get_pixel_format (GdkDisplay *display, MirBufferUsage usage);
 
+void _gdk_mir_display_focus_window (GdkDisplay *display, GdkWindow *window);
+
+void _gdk_mir_display_unfocus_window (GdkDisplay *display, GdkWindow *window);
+
 gboolean _gdk_mir_display_init_egl_display (GdkDisplay *display);
 
 EGLDisplay _gdk_mir_display_get_egl_display (GdkDisplay *display);
index 77fa665b7182fae68a8e8fc6592989120cd116bc..0e37794afe99f6822ae6cf0a59f1bd6ecc2a730a 100644 (file)
@@ -51,6 +51,8 @@ typedef struct GdkMirDisplay
 
   GdkKeymap *keymap;
 
+  GdkWindow *focused_window;
+
   MirPixelFormat sw_pixel_format;
   MirPixelFormat hw_pixel_format;
 
@@ -622,6 +624,25 @@ _gdk_mir_display_get_pixel_format (GdkDisplay *display,
   return mir_dpy->sw_pixel_format;
 }
 
+void
+_gdk_mir_display_focus_window (GdkDisplay *display,
+                               GdkWindow  *window)
+{
+  GdkMirDisplay *mir_display = GDK_MIR_DISPLAY (display);
+
+  g_set_object (&mir_display->focused_window, window);
+}
+
+void
+_gdk_mir_display_unfocus_window (GdkDisplay *display,
+                                 GdkWindow  *window)
+{
+  GdkMirDisplay *mir_display = GDK_MIR_DISPLAY (display);
+
+  if (window == mir_display->focused_window)
+    g_clear_object (&mir_display->focused_window);
+}
+
 gboolean
 _gdk_mir_display_init_egl_display (GdkDisplay *display)
 {
index 8c7e1063706a3dbde95768e50e6e1e7fd33b2157..a2a1a128b76640504d5764cf0cbc1465f1d78717 100644 (file)
@@ -240,9 +240,15 @@ generate_focus_event (GdkWindow *window, gboolean focused)
   GdkEvent *event;
 
   if (focused)
-    gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FOCUSED);
+    {
+      gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FOCUSED);
+      _gdk_mir_display_focus_window (gdk_window_get_display (window), window);
+    }
   else
-    gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FOCUSED, 0);
+    {
+      gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FOCUSED, 0);
+      _gdk_mir_display_unfocus_window (gdk_window_get_display (window), window);
+    }
 
   event = gdk_event_new (GDK_FOCUS_CHANGE);
   event->focus_change.send_event = FALSE;